package com.qf.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

@Configuration
public class JacksonConfig {

    // 前端传递的日期格式（与错误中的格式一致：yyyy/MM/dd HH:mm:ss）
    public static final String DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss";

    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        // 1. 配置全局 Date 类型解析格式（解决 java.util.Date 解析问题）
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
        objectMapper.setDateFormat(sdf);
        // 设置时区（避免时区偏移导致日期错误，如东八区）
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));

        // 2. （可选）如果用了 Java 8 的 LocalDateTime，也配置对应格式
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
        SimpleModule module = new SimpleModule();
        // LocalDateTime 序列化（后端返回给前端的格式）
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dtf));
        // LocalDateTime 反序列化（前端传递给后端的格式）
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dtf));
        // 解决 Long 类型精度丢失问题（如订单ID）
        module.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(module);

        return objectMapper;
    }
}